![AWS SAM으로 API Gateway를 만들어 봤습니다.](https://devio2023-media.developers.io/wp-content/uploads/2019/11/aws-sam.png)
AWS SAM으로 API Gateway를 만들어 봤습니다.
안녕하세요, 임채정입니다.
이번 블로그에서는 AWS SAM을 사용해서 API Gateway를 만들어보고 정리했습니다.
아젠다
- 사전 조건
- 코드 작성
- 실행
1. 사전 조건
SAM CLI가 실행할 환경에 다운로드 되어 있어야 합니다.
만약 해당 코드를 실행했을 때 다음과 같이 버전 정보가 나오지 않는다면 아래 사이트에 접속해서 자신의 OS에 맞는 페이지로 이동해서 SAM CLI 를 다운받아주시길 바랍니다.
$ sam --version SAM CLI, version 1.41.0
SAM CLI 를 다운받는 법
2. 코드 작성
이제 SAM으로 실행을 해보기 전에 코드를 작성하도록 하겠습니다.
다음과 같이 폴터 및 파일을 생성합니다.
SAM ├─ gener ├─ scr │ └─ app.py ├─ commands.sh └─ template.yaml
gener
: 나중에 패키지화된 CloudFormation의 템플릿이 저장된 폴더입니다.
app.py
: 생성할 람다 코드 내용
해당 람다는 API Gateway 를 통해 페이지에 람다의 리턴 값(sam test
)을 표시하는 함수입니다.
import boto3 import json import os print('Loading function') def respond(err, res=None): return { 'statusCode': '400' if err else '200', 'body': err.message if err else json.dumps(res), 'headers': { 'Comtent-Type': 'application/json', }, } def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) return respond(None, res="sam test")
template.yaml
: 생성할 리소스의 템플릿
해당 템플릿에서는 람다 함수와 API Gateway가 생성됩니다.
AWSTemplateFormatVersion: "2010-09-09" Transform: 'AWS::Serverless-2016-10-31' Description: A Simple AWS Lambda function # ------------ # Parameters # ------------ Resources: SamTest: Type: 'AWS::Serverless::Function' Properties: Handler: app.lambda_handler Runtime: python3.6 CodeUri: src/ Description: A Simple AWS Lambda function MemorySize: 128 Timeout: 3 Events: SamTestAPI: Type: Api Properties: Path: /sam Method: GET
commands.sh
: 실행할 명령어 정리
# create s3 bucket aws s3 mb s3://save-sam-code-202203 # package cloudformation aws cloudformation package --s3-bucket save-sam-code-202203 --template-file template.yaml --output-template-file gener/template-generated.yaml # deploy aws cloudformation deploy --template-file gener/template-generated.yaml --stack-name simple-lambda-gateway --capabilities CAPABILITY_IAM
3. 실행
이제 실제로 실행해보겠습니다.
실행 위의 commands.sh
에 적힌 명령어를 순서대로 실행하겠습니다.
1) S3 버킷 생성
aws s3 mb s3://save-sam-code-202203 # make_bucket: save-sam-code-202203
생성된 S3 버킷은 app.py
파일에서 정의한 람다 함수를 저장되는 목적으로 생성하고 나중에 CloudFormation 스택이 생성될 때 작성될 람다 함수의 코드를 가져오는데 사용합니다.
2) Cfn 패키지화 하기
aws cloudformation package --s3-bucket save-sam-code-202203 --template-file template.yaml --output-template-file gener/template-generated.yaml # Uploading to 045da98e5cd11be5695060df3172ff1a 362 / 362.0 (100.00%) # Successfully packaged artifacts and wrote output template to file gener/template-generated.yaml. # Execute the following command to deploy the packaged template # aws cloudformation deploy --template-file /Users/lim/Desktop/SAM/gener/template-generated.yaml --stack-name <YOUR STACK NAME>
결과적으로는 gener
폴터 안에 새로운 파일이 생성됩니다.
배포를 할 때는 생성된 template-generated.yaml
파일을 사용하게됩니다.
SAM ├─ gener │ └─ template-generated.yaml ├─ scr │ └─ app.py ├─ commands.sh └─ template.yaml
template-generated.yaml
: 실제 배포에 사용될 패키지화된 템플릿 파일
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: A Simple AWS Lambda function Resources: lambdaPython3: Type: AWS::Serverless::Function Properties: Handler: app.lambda_handler Runtime: python3.6 CodeUri: s3://save-sam-code-202203/045da98e5cd11be5695060df3172ff1a Description: A Simple AWS Lambda function MemorySize: 128 Timeout: 3 Events: SamTestAPI: Type: Api Properties: Path: /sam Method: GET
3) 배포
이번에는 실제로 배포를 하겠습니다.
다음 명령어를 통해 CloudFormation에서 template-generated.yaml
에 정의되어 있는 리소스를 생성하도록 합니다.
aws cloudformation deploy --template-file gener/template-generated.yaml --stack-name simple-lambda-gateway --capabilities CAPABILITY_IAM # Waiting for changeset to be created.. # Waiting for stack create/update to complete # Successfully created/updated stack - simple-lambda-gateway
4) 생성된 리소스의 확인
마지막으로 생성된 리소스를 확인하고 제대로 동작하는지 테스트해보겠습니다.
CloudFormation 스택
Lambda
람다도 잘 생성되어 있습니다. 같이 생성한 API Gateway가 트리거로 잘 설정이 되어 있는 것도 확인할 수 있습니다.
API Gateway
마지막으로 API Gateway도 잘 생성이 되었습니다.
그럼 이어서 생성된 리소스가 잘 생성되는지도 확인해보겠습니다.
먼저 생성한 API Gateway 리소스의 상세 페이지로 이동합니다.
그 중에서 [리소스] 탭으로 이동하면 GET이벤트를 테스트해볼 수 있습니다.
테스트를 눌러줍니다.
테스트 버튼을 눌러주면 오른쪽에 테스트 결과가 출력됩니다.
보이는 것처럼 람다의 리턴 값인 sam test
가 잘 출력되었습니다.
이번에는 다른 방법으로도 확인해보겠습니다.
[스테이지]탭으로 이동해서 Prod
를 선택합니다.
그러면 Prod 스테이지 편집기
가 오른쪽 페이지에 표시되는데 그중에서 맨 위에 있는 URL 호출에 있는 주소를 클릭합니다.
그러면 해당 URL 페이지로 들어가지는데 그 주소에template-generated.yaml
에서 설정해준 Path인 /sam
을 뒤에 붙여주면 다음과 같이 sam test
가 출력됩니다.
이것으로 성공적으로 리소스가 잘 실행되는 걸 확인할 수 있었습니다.
본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !